﻿using JX.Infrastructure.Field;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Linq;
using System.Threading.Tasks;

namespace JXWebSite.Components
{
	/// <summary>
	/// 字段编辑视图类
	/// </summary>
	public class FieldControlViewModel
	{
		/// <summary>
		/// 字段名
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string FieldName { get; set; } = string.Empty;

		/// <summary>
		/// 字段值
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string FieldValue { get; set; } = string.Empty;

		/// <summary>
		/// 字段类型
		/// </summary>
		public FieldType FieldType { get; set; } = FieldType.None;

		/// <summary>
		/// 字段级别 0：系统预定义字段；1：用户自定义字段；
		/// </summary>
		public int FieldLevel { get; set; } = 0;

		/// <summary>
		/// 字段别名
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string FieldAlias { get; set; } = string.Empty;

		/// <summary>
		/// 字段输入提示文本
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string Tips { get; set; } = string.Empty;

		/// <summary>
		/// 字段描述
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string Description { get; set; } = string.Empty;

		/// <summary>
		/// 是否禁用
		/// </summary>
		public bool Disabled { get; set; } = false;

		/// <summary>
		/// 是否必填
		/// </summary>
		public bool EnableNull { get; set; } = false;

		/// <summary>
		/// 字段自定义属性集合。
		/// TextType：最大字符数、文本框长度、布尔值（默认FALSE）、输入法设置、是否启用站内链接功能、是否启用字符过滤功能、是否启用字符屏蔽功能、验证规则、验证错误提示。
		/// MultipleTextType：显示的宽度、显示的高度、是否启用站内链接功能、是否启用字符过滤功能、是否启用字符屏蔽功能。
		/// MultipleHtmlTextType：编辑器类型、显示的宽度、显示的高度、是否启用站内链接功能、是否启用字符过滤功能、是否启用字符屏蔽功能。
		/// ListBoxType：选项内容（显示数据|保存数据$$$显示数据|保存数据）、显示选项使用类型（1：单选下拉列表框；2：多选列表框；3：单选按钮；4：复选框；）、是否允许“填充” 选项、每行显示项数。
		/// ListBoxIntroType：选项内容（显示数据|保存数据$$$显示数据|保存数据）、显示选项使用类型（1：单选按钮；2：复选框；）、每行显示项数。
		/// ListBoxDataType：SQL查询语句、显示文本的字段名、数据保存字段名、数据保存字段类型、显示选项使用类型（1：单选下拉列表框；2：多选列表框；3：单选按钮；4：复选框；）、是否显示“请选择”选项、每行显示项数。
		/// IntegerType：最小值、最大值、是否以百分比显示。
		/// NumberType：最小值、最大值、小数位数、是否以百分比显示。
		/// MoneyType：最小值、最大值。
		/// DateTimeType：日期格式（year,month,date,time,datetime）、日期默认值类型（0：无；1：当前日期；2：指定日期；）、是否开启区域选择。
		/// LookType：获取信息来自模型、在此模型对应信息表的字段。
		/// LinkType：文本框长度、最大字符数。
		/// BoolType：选择“是”的文本、选择“否”的文本。
		/// PictureType：图片文本框长度、允许的图片大小、允许的图片类型、是否从系统已上传图片中选择、图片是否加水印、是否上传缩略图、是否启用上传、是否从信息已上传图片中选择、上传文件名保存规则。
		/// FileType：允许的文件大小、允许的文件类型、是否为下载频道控件、是否保存文件大小、保存字段的名称、上传文件名保存规则、地址前缀、上传文件最大数量。
		/// InfoType：显示的宽度、显示的高度。
		/// AuthorType：文本框长度、是否保存上次记录、模型ID。
		/// SourceType：文本框长度、是否保存上次记录、模型ID。
		/// KeywordType：文本框长度、是否保存上次记录、模型ID。
		/// OperatingType：选项内容（多个值之间用“$$$”分隔）、文本框长度、是否保存上次记录、模型ID。
		/// DownServerType：文本框长度、是否保存上次记录、模型ID。
		/// SpecialType：显示的宽度、显示的高度。
		/// Producer：文本框长度、是否保存上次记录、模型ID。
		/// Trademark：文本框长度、是否保存上次记录、模型ID。
		/// ContentType：显示的宽度、显示的高度、允许上传的图片类型、允许上传的媒体类型、允许上传的附件类型、图片是否加水印、是否上传缩略图、允许的文件大小、上传文件名保存规则。
		/// TitleType：最大字符数、文本框长度、是否启用检测重复值、是否自动生成字母标题。
		/// MultiplePhotoType：允许的文件大小、允许的文件类型、图片是否加水印、上传文件名保存规则。
		/// Property：使用的值，多个值之间用“|”分隔。
		/// ProductStyle：使用的值，多个值之间用“|”分隔。
		/// SelectUser：文本框长度、是否保存上次记录、模型ID。
		/// RegionType：排列方式、显示方式、显示方式默认设置、是否必填。
		/// RegionTypeFive：排列方式、显示方式、显示方式默认设置。
		/// RegionTypeText：排列方式、显示方式、显示方式默认设置。
		/// RegionTypeSelect：行政区划默认设置。
		/// IndustryCategory：根节点ID。
		/// </summary>
		public Collection<string> Settings { get; set; } = new Collection<string>();

		/// <summary>
		/// 模型ID
		/// </summary>
		public int ModelID { get; set; } = 0;

		/// <summary>
		/// 是否后台管理界面使用的字段控件
		/// </summary>
		public bool IsAdminManage { get; set; } = false;

		/// <summary>
		/// 是否在页面上显示
		/// </summary>
		public bool IsShow { get; set; } = true;

		/// <summary>
		/// 控件ID前缀，同一个页面上，有多个组件时，用于区分相同控件的名称
		/// </summary>
		public string Prefix { get; set; } = string.Empty;

		/// <summary>
		/// 字段值的数据源
		/// </summary>
		public DataTable DataSource { get; set; } = new DataTable();

		/// <summary>
		/// 数据源对应的ID
		/// </summary>
		public int GID { get; set; } = 0;
	}
}
